package calculadorfpa.modelo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;

/**
 * @author TECBMBKD
 * @version 1.0
 * @created 19-jun-2011 14:18:05
 */
public abstract class AbstratoProjeto {

    private Map<CaracteristicaGeral, NivelInfluencia> caracteristicasGerais;
    private double fatorAjuste;
    private int id;
    private int nivelInfluencia;
    private String nome;
    private double pontoFuncao;
    private double pontoFuncaoAjustado;
    private int pontoFuncaoBruto;
    private double prazo;
    public CaracteristicaGeral caracteristicaGeral;

    public AbstratoProjeto() {
    }

    public void finalize() throws Throwable {
    }

    /**
     * Calcular o fator de ajuste de acordo com a <a href="$element://{E7F50E37-3092-
     * 4560-B4CC-98131009F058}"><font color="#0000ff"><u>RN001</u></font></a>.
     */
    protected void calcularFatorAjuste() {
        fatorAjuste = (nivelInfluencia * 0.01) + 0.65;
    }

    /**
     * Somar os valores dos niveis de influencia do map 'caracteristicasGerais'.
     */
    protected void calcularNivelInfluencia() {
        Iterator<NivelInfluencia> iterator = caracteristicasGerais.values().iterator();
        int total = 0;
        while (iterator.hasNext()) {
            NivelInfluencia ni = iterator.next();
            total += ni.getValor();
        }
        nivelInfluencia = total;
    }

    /**
     * Calcular o ponto de fun��o ajustado acordo com a <a href="$element://{E660AB3A-
     * 34AF-4329-AD66-80D2597188FA}"><font color="#0000ff"><u>RN003</u></font></a>.
     */
    protected void calcularPontoFuncaoAjustado() {
        pontoFuncaoAjustado = pontoFuncaoBruto * fatorAjuste;
    }

    protected abstract void calcularPontoFuncaoBruto();

    /**
     * Calcular o prazo de acordo com a <a href="$element://{433A44D6-62D9-419a-AA60-
     * 0E6840E819CC}"><font color="#0000ff"><u>RN002</u></font></a>.
     */
    protected void calcularPrazo() {
        prazo = pontoFuncaoAjustado * pontoFuncao;
    }

    /**
     * Executa os seguintes passos:
     *
     * 1. calcularNivelInfluencia()
     * 2. calcularFatorAjuste()
     * 3. calcularPontoFuncaoBruto()
     * 4. calcularPontoFuncaoAjustado()
     * 5. calcularPrazo()
     */
    public void calcularProjeto() {
        calcularNivelInfluencia();
        calcularFatorAjuste();
        calcularPontoFuncaoBruto();
        calcularPontoFuncaoAjustado();
        calcularPrazo();
    }

    public CaracteristicaGeral getCaracteristicaGeral() {
        return caracteristicaGeral;
    }

    public void setCaracteristicaGeral(CaracteristicaGeral caracteristicaGeral) {
        this.caracteristicaGeral = caracteristicaGeral;
    }

    public Map<CaracteristicaGeral, NivelInfluencia> getCaracteristicasGerais() {
        return caracteristicasGerais;
    }

    public void setCaracteristicasGerais(Map<CaracteristicaGeral, NivelInfluencia> caracteristicasGerais) {
        this.caracteristicasGerais = caracteristicasGerais;
    }

    public double getFatorAjuste() {
        return fatorAjuste;
    }

    public void setFatorAjuste(double fatorAjuste) {
        this.fatorAjuste = fatorAjuste;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getNivelInfluencia() {
        return nivelInfluencia;
    }

    public void setNivelInfluencia(int nivelInfluencia) {
        this.nivelInfluencia = nivelInfluencia;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getPontoFuncao() {
        return pontoFuncao;
    }

    public void setPontoFuncao(double pontoFuncao) {
        this.pontoFuncao = pontoFuncao;
    }

    public double getPontoFuncaoAjustado() {
        return pontoFuncaoAjustado;
    }

    public void setPontoFuncaoAjustado(double pontoFuncaoAjustado) {
        this.pontoFuncaoAjustado = pontoFuncaoAjustado;
    }

    public int getPontoFuncaoBruto() {
        return pontoFuncaoBruto;
    }

    public void setPontoFuncaoBruto(int pontoFuncaoBruto) {
        this.pontoFuncaoBruto = pontoFuncaoBruto;
    }

    public double getPrazo() {
        return prazo;
    }

    public void setPrazo(double prazo) {
        this.prazo = prazo;
    }
    
}
